근로저Clojure 입문 - Hello World
근로저의 장점에 대해 하루 종일도 약을 팔 수 있지만, 그런 것보다 직접 써보게 하면서 팔아 보려 한다.
코에 들이대지 말고 입에다 바로 쳐넣었어야지..
Linux 설치
제발 리눅스 설치해라. 두번해라. 세번해라. 농담이고 한번만 해라.
거의 모든 근로저 라이브러리나 리소스가 Unix-like 쉘에서 사용하는 것을 가정한다.
근로저는 애초에 대부분 서버용[1]으로 쓰이는 언어이기도 하고, 윈도우에서 쓰는 사람이 거의 없다.
이런 언어를 쓰는데 윈도를 고집하다 보면 윈도의 졷같은 경로나 괴상한 정책 땜에 문제가 생겨도 도와줄 수 있는 사람이 없다. 근로저만 해도 힙스턴데 그걸 윈도랑 쓰는 새끼[2]는 진짜 미친 힙스터새끼기 때문에...
그래서 다음 명령어를 어디에 집어 넣는 건지, 출력은 뭐가 나오는지 모르는 사람은 솔직히 근로저를 배울 수도 활용할 수도 없다.
$ ls -l /home
리눅스 설치해라. 요새 깃갤에서 리눅스 데탑 내려치기 하던데 모르겠고 근로저 쓸거면 인간적으로 리눅스 설치해라.
아니면 최소한 맥북이라도 써라. 근데 리눅스가 공짜니까 리눅스 설치해라.
신뢰와 믿음의 갓분투 LTS 설치해라.
rufus로 USB에 우분투 iso 이미지 박아서 부팅 디스크 만들고 컴에 USB 박아 넣고 전원 누르고 del 연타해서 BIOS 들어간 다음 USB 부팅되게 하고 껐다 켠 다음에 시키는 대로 하면 설치가 된다. 참 쉽죠?
진짜 쉬우니까 이번 기회에 리눅스 설치해 보자.
사실 나는 만자로 쓰지만... 아무튼 설치해라..
이제부터 독자는 리눅스를 쓸 수 있으며, 터미널(에뮬레이터)에서 쉘 커맨드를 실행할 줄 안다고 가정한다. 모르면 배우세요!
참고로 (GNOME DE 기준) 파일 익스플로러에서 오른쪽 마우스키를 누르면 Open in terminal
같은 게 나오는데, 이걸 누르면 터미널 에뮬레이터에서 현재 경로의 쉘을 띄워준다.
여기다 명령어를 입력하고 엔터를 누르면 쉘 커맨드를 실행할 수 있다.
Clojure 설치
배포판에서 패키지를 제공한다면 꽤끼지 매니저를 써서 Clojure를 설치할 수 있다. 만자로나 arch의 경우는 가능하다.
sudo pacman -Syu
sudo pacman -S clojure
우분투나 데비안 계열은 apt를 써야 하는데 여기는 Clojure를 패키지로 제공하진 않는 거 같다. 그러면 공홈에서 제공하는 스크립트를 써야하는데 별로 어려운 건 없다.
먼저 bash
curl
java
rlwrap
이 설치되어 있어야 한다.
근데 bash랑 curl은 보통 설치되어 있으니까 갓바랑 rlwrap만 설치하면 된다.
sudo apt-get install openjdk-11-jdk rlwrap
이제 다음을 실행하면 알아서 스크립트를 받고 설치해준다.
curl -L -O https://github.com/clojure/brew-install/releases/latest/download/linux-install.sh
chmod +x linux-install.sh
sudo ./linux-install.sh
다음 명령어를 실행했을 때 결과가 제대로 나오면 성공한 것이다
명령: clj --version
결과: Clojure CLI version 1.11.1.1208
Hello World!
REPL에서 hello world
REPL은 Read Eval Print Loop
의 두문자어다. 명령을 읽고Read, 해석Eval[3]하고, 해석 결과를 출력Print하고, 이걸 반복Loop하는 프로그램이다. 다음 명령으로 근로저 REPL을 켤 수 있다.
clj
그러면 이렇게 뜬다.
Clojure 1.11.1
user=>
프롬프트에 코드를 입력한 뒤 enter를 누르면 입력된 코드를 해석하고, 결과를 출력해 주고 다시 프롬프트를 띄운다.
user=> (println "Hello World!")
Hello World!
nil
user=> (println "안뇽안뇽")
안뇽안뇽
nil
user=> (+ 1 2 3 4)
10
user=>
파일에서 hello world: 무작정 따라하기
최근 근로저는 동봉된 clj
가 쓸만해져서 lein
이나 boot
같은 서드 파티 빌드 툴 없이 clj
만 써도 충분히 굴릴만 하다[4]. 내가 이 튜토리얼을 쓰게 된 이유이기도 하다.
먼저 가장 간단한 클로저 프로젝트를 만들자. 정말 별 거 없다.
src
디렉토리를 만들고 거기 .clj
파일을 추가하기만 하면 된다.
mkdir src
touch src/hello.clj
(물론 꼭 명령어 쓸 필요 없이 마우스로 해도 된다)
이제 src
아래 생성된 hello.clj
에서 헬로월드를 실행할 수 있게 고쳐보자. 에디터는 아무거나 써도 된다. 다음을 입력하자. 복붙해도 된다!
(ns hello)
(defn f [opts]
(println "hello world"))
됐는가? tree .
와 cat src/hello.clj
명령어 실행 결과가 다음과 같다면 된 것이다.
tree .
.
└── src
└── hello.clj
2 directories, 1 file
cat src/hello.clj
(ns hello)
(defn f [opts]
(println "hello world"))
이제 다음을 실행하면 된다
clj -X hello/f
결과는 다음과 같다
hello world
파일에서 hello world: 코드 설명
방금 뭘 한거지? 하나하나 설명해 주겠다.
다른 많은 언어에서는 다음처럼 다양한 문법을 제공한다
x = 1 + 2 * b // 계산식 statement
System.out.println("ppap") // Java 등의 메서드 호출
int f(int a, int b) {...} // C계열 언어의 함수 정의
#define MACRO(x) ... // C 매크로 정의
f(a, b, c) // C계열 언어의 함수/매크로 호출
근로저 문법은 별 게 없다. 근로저는 실행 문법으로 단! 하나! 만 제공한다
(f a b c)
이게 끝이다. C계열 함수 호출과 비슷하지만 괄호를 맨 앞에 써야 하고 쉼표를 생략할 수 있다.
그러면 우리가 작성한 코드를 해석해 보자.
(ns hello)
(defn f [opts]
(println "hello world"))
ns defn println
은 언어가 미리 정의해둔 것들이다.
(ns hello)
ns
는 현재 네임스페이스를 정의한다. ns
로 현재 네임스페이스를 정의한 뒤, 네임스페이스 안에서 데이터나 함수를 정의할 수 있다.
(defn f [opts]
(println "hello world"))
defn
은 함수를 정의한다. 위 코드는 인자 opts
를 하나 받는 f
라는 이름의 함수를 정의한다. 함수의 body에는 "hello world"를 출력하는 표현식이 있다.
파일에서 hello world: 실행 설명
clj
는 Clojure CLI tool로, REPL과 Clojure 프로그램/표현식 실행기를 제공한다. 우리는 방금 Clojure 실행기를 써서 코드를 실행한 것이다.
clj
는 -X
옵션을 써서 인자를 하나 받는 함수를 실행할 수 있다.
clj -X ns-name/fn-name
요약
- 근로저 개발에 유닉스 쉘은 선택이 아닌 필수. 리눅스를 설치하고 익숙해지자
- Clojure를 설치해 보자
- 헬로월드를 실행해 보자
- 클로저의 실행 문법은
(f a b c)
밖에 없다 clj -X
로 파일에 정의한 함수를 실행할 수 있다
- 클로저의 실행 문법은
마지막으로..
어떤가? 정말 쉽지 않은가? 하지만 원래 아무리 언어가 어려워도 헬로 월드는 쉬운 법이다..
이번에 헬로월드를 봤으니, 다음 튜토리얼에서는 실제로 프로젝트를 굴리는 법을 설명하겠다. 에디터로 코드를 작성하고, REPL에 연결하여 실행하면서 코딩하고, jar로 컴파일하여 배포하는 법 등이 되겠다.
이 때도 내가 아는 가장 간단하고 쉬운 방법, 시대에 뒤쳐지지 않은 모던한 방법과 함께 중요 개념들을 설명할 것이다.
영어를 할 줄 안다면 근로저 공식사이트 가이드 글을 정독하는 것이 큰 도움이 된다. 사실 나도 그렇게 배웠다.
- https://clojure.org/guides/install_clojure 설치 방법
- https://clojure.org/guides/deps_and_cli
clj
관련 - https://johngrib.github.io/search/?searchString=clojure
종립
센세가 한글로 번역한 글들이 많다. 영어로 직접 공홈 가이드 글을 보며 배우는게 최선이지만 힘들다면 이걸 봐도 된다. - https://clojuredocs.org/ 코어 라이브러리 레퍼런스와 함께 사용례들을 제공한다.
ns
,defn
,println
을 검색해 보자.
근로저 창시자 힛키쿤도 딱히 의도한 건 아니지만, 자기가 해왔던 일이 서버 쪽이었기에 만들고 보니 그렇게 되었다고 한다: 'Situated' Programs, transcript ↩︎
방법이 있긴 한데 절대로 권장하지 않는다. https://github.com/clojure/tools.deps.alpha/wiki/clj-on-Windows 시작은 리눅스에서 하는 게 낫고 정말로 윈도우에서 하고 싶으면 내가 Clojure 실력이 좀 친다 싶을 때 새로운 도전으로 해보자. ↩︎
Evaluate의 사전적 의미는 "평가하다"지만, 사실 REPL의 Eval은 수학적 의미에서 "값을 구하다"에 가깝다. 하지만 뉴비에게는 "해석하다"가 더 와닿을 거 같아서 이렇게 썼다. ↩︎
점점 더 많은 사람들이 서드 파티 빌드 툴이 아니라 clj를 쓰고 있다 https://clojure.org/news/2022/06/02/state-of-clojure-2022#_working_with_clojure ↩︎